<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // myAsync("a1", res=>{
  //   console.log(res)
  // })
  // myAsync("a2", res=>{
  //   console.log(res)
  // })
  // myAsync("a3", res=>{
  //   console.log(res)
  // })

  // 使用回调地狱，同时获取多个异步成功后的数据
  // myAsync("a1", res1=>{
  //   myAsync("a2", res2=>{
  //     myAsync("a3", res3=>{
  //       console.log(res1, res2, res3);
  //     })
  //   })
  // })
  // function myAsync(name, cb){
  //   setTimeout(()=>{
  //     cb(name + "成功了")
  //   }, Math.random()*100);
  // }

  // ===========

  // promiseAsync("ps1").then(res=>{
  //   console.log(res)
  // })
  // promiseAsync("ps2").then(res=>{
  //   console.log(res)
  // })
  // promiseAsync("ps3").then(res=>{
  //   console.log(res)
  // })

  const p1 = promiseAsync("ps1");
  const p2 = promiseAsync("ps2");
  const p3 = promiseAsync("ps3");
  
  // 使用Promise类的all方法，批处理多个promise实例的状态，可以实现同时获取多个异步的数据
  // all全部成功，才是成功，只要有一个失败，就是失败
  Promise.all([p3, p1, p2]).then(res=>{
    console.log(res);
  }).catch(code=>{
    console.log(code);
  })

  // race只要有一个结束，就结束，不管成功或失败
  Promise.race([p1, p2, p3]).then(res=>{
    console.log(res)
  }).catch(code=>{
    console.log(code)
  })

  // any全部失败，才是失败，只要有一个成功，就是成功
  Promise.any([p1,p2,p3]).then(res=>{
    console.log(res)
  }).catch(code=>{
    console.log(code)
  })

  // allSettled无论成功或失败，都会被记录
  Promise.allSettled([p1,p2,p3]).then(res=>{
    console.log(res)
  })

  // 以上类的方法都是批处理方法：将多个promise实例打包成一个新的promise实例，新的promise实例的状态会根据当前方法的规则确定

  function promiseAsync(name){
    return new Promise((resolve, reject)=>{
      setTimeout(()=>{
        resolve(name + "成功了")
      }, Math.random()*100);

      setTimeout(()=>{
        reject(name + "失败了")
      }, Math.random()*100);
    })
  }
  
</script>
</html>